iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
自我挑戰組

30 天 Node.js 探索:基礎、進階與實踐系列 第 19

Day 19: 測試與偵錯:Mocha、Chai 基礎

  • 分享至 

  • xImage
  •  

接下來要學習如何使用 Mocha 測試框架與 Chai 斷言庫對 Node.js 應用進行單元測試,並了解測試的重要性及其在開發流程中的角色。

測試的重要性

測試是軟體開發中的重要環節,通過自動化測試,開發者可以:

  • 確保程式碼正確性: 在開發新功能或修改程式時,避免引入錯誤。
  • 提升維護性: 良好的測試用例讓開發者在修改現有程式時有更強的信心。
  • 節省時間: 自動化測試減少了人力的回歸測試工作,提高了開發效率。

Mocha 簡介

Mocha 是 Node.js 中算是數一數二知名測試框架,支持同步和非同步測試,並且提供靈活的配置選項。

  • 簡單好上手: 語法簡單,適合進行單元測試和整合測試。
  • 支援非同步測試: 可以對異步程式碼進行測試。
  • 豐富的報告格式: 支持多種測試報告格式。

Chai 簡介

Chai 是一個斷言庫,用於編寫斷言(assertions)來判斷程式的輸出是否符合預期。它與 Mocha 常常配合使用。

  • Assert 風格: 傳統的斷言風格,類似於 Node.js 原生的 assert 模組。
  • Expect 風格: 自然語言風格,適合更具可讀性的測試。
  • Should 風格: 類似於 expect,但會直接對對象增加 should 屬性。

安裝 Mocha 和 Chai

在專案中安裝 Mocha 和 Chai 作為開發依賴:

bash
npm install --save-dev mocha chai

建立測試目錄

在專案的根目錄下創建一個 test 目錄,並在其中放置測試文件。例如,測試檔案命名為 test/example.test.js。

撰寫簡單測試

以下是使用 Mocha 和 Chai 測試一個簡單函數的範例:
sum.js:

js
function sum(a, b) {
  return a + b;
}

module.exports = sum;

test/sum.test.js:

js
const sum = require('../sum');
const chai = require('chai');
const expect = chai.expect;

describe('Sum Function', () => {
  it('應該正確地返回兩個數字的和', () => {
    const result = sum(2, 3);
    expect(result).to.equal(5);
  });

  it('應該返回一個數字', () => {
    const result = sum(2, 3);
    expect(result).to.be.a('number');
  });
});

在這裡,我們測試了 sum 函數是否正確返回了兩個數字的和,並且檢查結果是否為數字類型。

執行測試

在 package.json 中添加測試腳本:

json
"scripts": {
  "test": "mocha"
}

使用以下命令來運行測試:

bash
npm test

Mocha 會自動找到 test 目錄中的測試文件並執行它們。如果測試成功,會顯示綠色的通過訊息。

測試非同步程式

Mocha 支援對非同步程式進行測試,這在 Node.js 中尤為重要,因為大多數操作都是非同步的。
以下是測試一個模擬非同步函數的範例:
asyncFunction.js:

js
function asyncFunction(callback) {
  setTimeout(() => {
    callback('Hello World');
  }, 1000);
}

module.exports = asyncFunction;

test/asyncFunction.test.js:

js
const asyncFunction = require('../asyncFunction');
const chai = require('chai');
const expect = chai.expect;

describe('Async Function', () => {
  it('應該返回 "Hello World" 進行回調', (done) => {
    asyncFunction((result) => {
      expect(result).to.equal('Hello World');
      done();
    });
  });
});

注意這裡的 done 參數,它用來告訴 Mocha 何時完成測試,這在非同步測試中非常重要。

使用 before 和 after Hook

Mocha 提供了 before、after、beforeEach 和 afterEach Hook,用來在測試執行前後執行特定的操作。這些 Hook 對於初始化數據或清理資源非常有用。
以下是 Hook 的範例:

js
describe('Hooks Example', () => {
  before(() => {
    console.log('在所有測試前執行一次');
  });

  after(() => {
    console.log('在所有測試後執行一次');
  });

  beforeEach(() => {
    console.log('在每個測試前執行');
  });

  afterEach(() => {
    console.log('在每個測試後執行');
  });

  it('第一個測試', () => {
    // 測試代碼
  });

  it('第二個測試', () => {
    // 測試代碼
  });
});

測試覆蓋率

測試覆蓋率是指有多少比例的程式碼被測試。透過工具如 nyc 可以測試覆蓋率並生成詳細報告。

安裝 nyc

bash
npm install --save-dev nyc

在 package.json 中修改測試腳本以啟用覆蓋率報告:

json
"scripts": {
  "test": "nyc mocha"
}

執行測試後,將顯示程式碼的覆蓋率報告,包括覆蓋了多少函數、多少行程式碼等。

總結

今天學習了如何使用 Mocha 和 Chai 進行測試,理解了測試在開發流程中的重要性,並了解了如何撰寫單元測試、非同步測試和使用 Hook 來控制測試流程。在後續的開發中,測試將成為確保程式碼品質的重要工具。


上一篇
Day 18: 部署 Node.js 應用程式至 Heroku
下一篇
Day 20: 性能優化與記憶體管理
系列文
30 天 Node.js 探索:基礎、進階與實踐26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言